iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

上次介紹的棒球套件很少更新了,那就只好自己寫一個!?系列 第 29

Day 29 - 使用 logging 顯示更多訊息給使用者

  • 分享至 

  • xImage
  •  

在昨天有簡單提到了一下 logging 這個工具,今天會再做更深入的介紹,因為當使用者在使用我們的套件的時候,提供好的訊息也可以讓他們更快更容易的操作,我們在開發的時候有時候也能透過這些額外的資訊更好除錯。今天的文章也會參考官方的文件進行介紹。

Level

要使用 logging,因為是 Python 內建的功能,所以可以直接 import 後就能使用。昨天我們是直接使用 basicConfig 進行 logging 的設定:

import logging
logging.basicConfig(level=logging.DEBUG)

這段程式碼的意思就是,把顯示 logginglevel 改成 DEBUG,他總共會有五種 level,分別為:

  • DEBUG:提供詳細的說明,通常會先隱藏,讓有需要的人再來查看,用來診斷跟分析問題會使用。
  • INFO:用來確認事件是否完成,或是程式是否如預期中運行會使用,提供一些簡單的資訊確認。
  • WARNING:回報未來可能會造成問題的警告,或是提醒非預期的事情發生。
  • ERROR:回報程式發生什麼錯誤,可能造成哪些功能無法使用。
  • CRITICAL:回報更嚴重的錯誤產生,可能造成整個程式無法運作。

他們的顯示優先度也照著上面的排列,假設 level 設成 DEBUG 會全部都顯示,如果是設成 ERROR,那就只會顯示 ERRORCRITICAL
熟悉這五個類別,就可以判斷出我們在提供說明資訊的時候,應該套用哪個 level,或是在看別人的 logging 的時候,能判斷出訊息中的類別,更快能找到需要優先閱讀的項目。
通常預設顯示都是到 WARNING,當我們想要看更多詳細資訊的時候才會把 level 調整成 DEBUG。上面那段程式碼就是把預設進行修改,所以我們才能看到 requests 套件提供的更多訊息。

Logger

如果是直接使用 basicConfig 的話,他會直接一次影響到所有的 logging 顯示,但我們可能會想讓不同的 function,顯示不同的 level。譬如說我平常使用的時候,不會特別想知道 DEBUG 裡的訊息,想要再發生問題的時候,進行除錯時再打開。這時候就可以使用 logger 進行 level 的調整。

logger 的概念就很像他是一個獨立出來的 config,可以進行設定的調整,但不影響到其他 logger。要產生他也很簡單,只要使用 logginggetLogger 就好,程式碼如下:

import logging

# 這行還是要,有點像是初始化的感覺
logging.basicConfig()
logger = logging.getLogger()

這樣我們就會獲得一個 logger,之後我們就能使用 logger.setLevel() 來改變顯示的優先度,也可以開始使用像是 logger.info() 來提供我們自製的訊息:

logger.setLevel(logging.INFO)

logger.debug("Test 1")
logger.info("Test 2")
logger.error("Test 3")

上面的程式碼代表我們先把優先度設成 INFO,然後下面會是我們的自製說明。由於我們現在的優先度是 INFO,所以 Test 1 這個訊息不會顯示,其他則會顯示像是:
https://ithelp.ithome.com.tw/upload/images/20241013/20163024nFCh4QGCbv.png

可以看到 logger 會根據我們使用的 level 來顯示訊息,中間那個 root 是指 logger 的名稱,因為我們在 getLogger 的時候沒傳入字串進去,所以會是預設的 root。我們可以傳入自己想要的命名,或是使用 getLogger(__name__) 來讓名稱變成當前 logger 所在的模組名稱。
這個顯示的格式,其實也可以透過 basicConfig 去定義,只要更新 format 參數就可以,可以參考文章裡的:Changing the format of displayed messages

根據參數改變優先度

有了 logger 後,我們可以在我們的 function 裡多加一個 debug 參數,如果他是 True,我們就能把優先度改變成 DEBUG,這樣我們可以讓使用者手動決定要不要顯示更詳細的訊息,一樣是使用到 setLogger,程式碼可以寫成這樣:

import logging

logging.basicConfig()
logger = logging.getLogger()

def statcast_search(**params, debug = False):
    if (debug):
        logger.setLogger(logging.DEBUG)
    # other code...

透過一個簡單的判斷式去處理,然後預設 debugFalse。之後我們就可以使用 logger.debug 來存放一些除錯用的詳細訊息,像是輸入的 params 長得如何,或是組合完給 requestsURL,或是一些當前的設定,都可以使用。

本日小結

今天再更深入介紹 logging 這個內建功能,如果使用好的話,能讓不管使用者或開發者,都能獲得更詳細分好類的資訊,是個在開發 Python 套件時的實用工具,是個比直接使用 print 來除錯外更好的選擇。另外他在 Python 當 API Server 的時候也是一個很好用的工具,可以透過 level 快速找到問題,大家可以多熟悉這個工具。

最後一樣感謝大家耐心地看到這,這已經是倒數第二天的文章,真的很感謝,有任何的問題與建議一樣歡迎大家在留言告訴我,明天會做個這次鐵人賽的總整理,明天見,掰掰。


上一篇
Day 28 - 簡單使用 timeit 測試程式執行時間與 requests.Session() 增加效能
下一篇
Day 30 - 總整理以及鐵人賽心得
系列文
上次介紹的棒球套件很少更新了,那就只好自己寫一個!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言